/**
 * 教师模块校验文件
 */

const Joi = require('joi');
const { messages, validPage } = require('./common');

/**
 * 校验登录用户
 */
const validLoginUser = Joi.object({
    username: Joi.string().label('用户名').empty().min(2).max(20).required().messages(messages),
    password: Joi.string().label('密码').empty().pattern(/^[\da-zA-Z-_+=]{6,20}$/).required().messages({
        ...messages,
        'string.pattern.base': '密码必须为6-20位数字、字母或-_+=的组合'
    }),
});

/**
 * 校验添加对象
 * @param {*} ctx 上下文
 * @param {Function} next 下一个执行的函数
 */
const validAdd = Joi.object({
    name: Joi.string().label('名字').empty().min(2).max(20).required().messages(messages),
    work_no: Joi.number().label('工号').integer().min(1000000).max(9999999).required().messages(messages),
    salary: Joi.number().label('薪资').integer().min(1000).max(9999999).required().messages(messages),
    position: Joi.number().label('职称').integer().min(1).required().messages(messages),
    idNo: Joi.string().label('身份证号').pattern(/^\d{17}[\dXx]$/).required().messages(messages),
    phone: Joi.string().label('手机号').pattern(/^1[3-9]\d{9}$/).required().messages(messages),
    address: Joi.string().label('地址').empty().min(10).max(100).required().messages(messages),
    subject: Joi.number().label('科目').integer().min(1).required().messages(messages),
}).concat(validLoginUser);

/**
 * 校验修改
 */
const validUpate = Joi.object({
    id: Joi.number().label('教师ID').integer().min(1).required().messages(messages),
    name: Joi.string().label('名字').empty().min(2).max(20).required().messages(messages),
    work_no: Joi.number().label('工号').integer().min(1000000).max(9999999).required().messages(messages),
    salary: Joi.number().label('薪资').integer().min(1000).max(9999999).required().messages(messages),
    position: Joi.number().label('职称').integer().min(1).required().messages(messages),
    idNo: Joi.string().label('身份证号').pattern(/^\d{17}[\dXx]$/).required().messages(messages),
    phone: Joi.string().label('手机号').pattern(/^1[3-9]\d{9}$/).required().messages(messages),
    address: Joi.string().label('地址').empty().min(10).max(100).required().messages(messages),
    subject: Joi.number().label('科目').integer().min(1).required().messages(messages),
});

/**
 * 验证角色
 */
const validRoles = Joi.object({
    teacherId: Joi.number().label('教师Id').integer().min(1).required().messages(messages),
    roleIds: Joi.array().label('角色Id').items(Joi.number().label('角色Id').integer().min(0)).required().messages(messages)
});

/**
 * 校验修改密码
 */
const validUpdatePassword = Joi.object({
    password: Joi.string().label('新密码').pattern(/^[\da-zA-Z-_+=]{6,20}$/).required().messages({
        ...messages,
        'string.pattern.base': '新密码必须为数字、字母或-_+=的组合，并且6-20位'
    }),
    confirmPassword: Joi.string().label('确认密码').pattern(/^[\da-zA-Z-_+=]{6,20}$/).required().valid(Joi.ref('password')).messages({
        ...messages,
        'string.pattern.base': '确认密码必须为数字、字母或-_+=的组合，并且6-20位',
        'any.only': '两次输入的密码不一致'
    })
});

/**
 * 校验管理员修改密码
 */
const validManageUpdatePassword = Joi.object({
    id: Joi.number().label('教师ID').integer().min(1).required().messages(messages)
}).concat(validUpdatePassword);

/**
 * 校验修改我的密码
 */
const validUpdateMyPassword = Joi.object({
    oldPassword: Joi.string().label('旧密码').pattern(/^[\da-zA-Z-_+=]{6,20}$/).required().invalid(Joi.ref('password')).messages({
        ...messages,
        'string.pattern.base': '旧密码必须为数字、字母或-_+=的组合，并且6-20位',
        'any.invalid': '新旧密码不能一样'
    })
}).concat(validUpdatePassword)

/** 
 * 校验更改状态
 */
const validChangeStatus = Joi.object({
    id: Joi.number().label('教师ID').integer().min(1).required().messages(messages),
    status: Joi.boolean().label('状态').required().messages(messages),
    date: Joi.date().label('日期').required().messages(messages)
});

/**
 * 校验搜索教师列表
 */
const validSearchTeacher = Joi.object({
    name: Joi.string().label('教师姓名').max(20).allow('').messages(messages),
    phone: Joi.string().label('手机号').max(11).allow('').messages(messages),
    idNo: Joi.string().label('身份证号').max(18).allow('').messages(messages),
    subject: Joi.number().label('科目').integer().messages(messages)
}).concat(validPage);

/**
 * 校验教师添加紧急联系人
 */
const validAddEmergency = Joi.object({
    teacher_id: Joi.number().label('教师ID').integer().min(1).required().messages(messages),
    contact_name: Joi.string().label('联系人姓名').max(20).empty().required().messages(messages),
    contact_relation: Joi.string().label('与联系人关系').max(10).empty().required().messages(messages),
    phone: Joi.string().label('手机号').pattern(/^1[3-9]\d{9}$/).required().messages(messages)
});

/**
 * 校验修改紧急联系人
 */
const validUpdateEmergency = Joi.object({
    id: Joi.number().label('ID').integer().min(1).required().messages(messages)
}).concat(validAddEmergency);

/**
 * 校验搜索工作状态
 */
const validSearchStatus = Joi.object({
    teacher_id: Joi.number().label('教师ID').integer().min(1).allow(null).messages(messages),
    start_date: Joi.date().label('开始时间').allow('', null).messages(messages),
    end_date: Joi.date().label('结束时间').allow('', null).messages(messages),
    status: Joi.number().label('状态').integer().valid(0, 1, 2).messages(messages),
}).concat(validPage);

/**
 * 校验搜索有效教师列表
 */
const validSearchAvailableTeacher = Joi.object({
    name: Joi.string().label('教师姓名').max(20).allow('').messages(messages),
    phone: Joi.string().label('手机号').max(11).allow('').messages(messages),
    idNo: Joi.string().label('身份证号').max(18).allow('').messages(messages),
    all: Joi.bool().label('是否查询所有').allow(null).messages(messages),
    subject: Joi.number().label('科目').integer().messages(messages)
}).concat(validPage);

module.exports = {
    validAdd,
    validRoles,
    validUpate,
    validLoginUser,
    validSearchStatus,
    validChangeStatus,
    validAddEmergency,
    validSearchTeacher,
    validUpdateEmergency,
    validUpdateMyPassword,
    validManageUpdatePassword,
    validSearchAvailableTeacher
}